编程方式一
画状态图
秒表的状态图,其中秒表有:重置,运行中,已停止3个状态
编写xml文件
秒表状态机定义文件:stopwatch1.xml
,xml文件分析请看后面
|
编写程序控制状态转移
需要操作的实体类,用来约束秒表的行为:StopWatchEntity.java
|
界面类:StopWatchFrame.java
程序结果分析
程序界面类中的定时器一直在访问 StopWatchEntity的getDisplay属性,来得到秒表的值。我们通过Start,Stop,Reset来控制秒表的状态,在进入某一个状态机的时候,我们调用这个状态机根上下文设置的stopWatcheEntity对象相应的方法,来改变秒表的值。当秒表一直处于某一个状态的时候,我们又通过点击按钮来改变秒表的状态。
编程方式2
画状态图
图和方式一一样
编写状态图xml文件
stopwatch2.xml
,这个类里面没有了srcipt等标签。
编写程序控制状态转移
需要操作的实体类(同时也是状态机类),用来约束秒表的行为:StopWatchStateMachine.java
。这个类中的方法名字和上面的StopWatchEntity.java
名字稍有不同,这个类里面的名字必须要和所对应的xml文件里面的状态名字相同。这是因为当状态发生转移的时候,进入某一个状态的时候,由框架自身根据反射机制去调用对应的方法。
|
StopWatchDisplay.java
界面展现类
|
程序结果分析
程序界面类中的定时器一直在访问 StopWatctStateMachine的getDisplay方法,来得到秒表的值。我们通过Start,Stop,Reset来控制秒表的状态,在进入某一个状态机的时候,由框架自动调用对应状态名相同的的函数,来改变秒表的值。当秒表一直处于某一个状态的时候,我们又通过点击按钮来改变秒表的状态。
源代码AbstractStateMachine.java
中对应的调用语句如下
两种方式的总结
其实第二种方式是官网给出的例子里面的,同时也是更贴近状态机对象的思想。但是也有如下缺点(也许)
1、 stopWatchStateMachine.fireEvent(StopWatchStateMachine.EVENT_START);
只有这一个触发事件的函数,不能传递数据。而第一种方式里面的executor.triggerEvent(new TriggerEvent(“watch.start”, TriggerEvent.SIGNAL_EVENT),数据);
可以通过触发时间传递数据进入状态机里面。